package acm;

import java.util.Scanner;

public class HuiWenNumber {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			String string = scanner.nextLine();
			// getHuiWenNumber(string.toCharArray());
			getHuiWenString(string.toCharArray());
		}
		scanner.close();
	}

	// 获取最大的回文子串的长度
	public static void getHuiWenNumber(char[] s) {
		// 定义i指向字符串头，定义j指向尾
		// 从第二处开始判断是否是回文串以及长度
		int result = 1; // 最短的回文数是1
		// int tempCount=0; //暂时用来记录相等时两者之间的距离
		if (s == null || s.length <= 0) {
			System.err.println("您输入的字符串有误");
			return;
		}
		for (int i = 0; i < s.length - 1; i++) {
			for (int j = s.length - 1; j > i; j--) {
				// 再定义一个变量k在i与j中移动
				// k的对称变量应该为j-（k-i）=j+i-k；
				int k;
				for (k = i; k <= (j + i) / 2; k++) {
					if (s[k] != s[j + i - k]) {
						break;
					}
				}
				// k>(j+i)/2表示循环执行完毕
				if (k > (j + i) / 2 && j - i + 1 > result) {
					result = j - i + 1;
				}
			}
		}
		System.out.println(result);
	}

	// 优化的获取回文子串,支持标点符号以及空格（忽略不计）
	public static void getHuiWenString(char[] s) {
		int[] p = new int[5000]; // 由于处理回文的时候将标点符号全部去掉了，所以定义一个数组用来还原数组
		char[] buf = new char[s.length];
		int i = 0, startIndex = 0, endIndex = 0; // startIndex表示开始的索引值，endIndex表示结束的索引值
		int maxCount = 1; // 定义初始最大回文串长度为1
		int m = 0; // m表示buf的下标
		for (; i < s.length; i++) {
			if (isWord(s[i])) {
				p[m] = i; // p存储第i个元素的下标
				buf[m++] = Character.toLowerCase(s[i]); // 可能有大写字母，将大写字母转换为小写字母
			}
		}
		System.out.println(buf);
		// 注意此处不能用buf.length，因为有标点符号的话，buf最后肯定有空的
		// 而且注意最后m++，不可能取到m
		for (i = 0; i < m; i++) {
			System.out.print(p[i] + "");
			// 枚举回文串的中间位置，直到有字符不相等
			// 对于奇数长的字符串
			for (int j = 0; i - j >= 0 && i + j < m; j++) {
				// 若有字符不相等，则跳出循环
				if (buf[i - j] != buf[i + j])
					break;
				if (j * 2 + 1 > maxCount) {
					// 对于奇数长的字符串，总得长度是2*j+1
					maxCount = j * 2 + 1;
					// 通过p数组的映射，找到原数组中对应的位置
					startIndex = p[i - j];
					endIndex = p[i + j];
				}
			}
			// 对于偶数长的字符串
			for (int j = 0; i - j >= 0 && i + j + 1 < m; j++) {
				// 偶数长得字符串应该是是这样从两边扩展的
				if (buf[i - j] != buf[i + j + 1])
					break;
				if (j * 2 + 2 > maxCount) {
					// 长度为2*j+2
					maxCount = j * 2 + 2;

					startIndex = p[i - j];
					endIndex = p[i + j + 1];
				}
			}
		}
		for (i = startIndex; i <= endIndex; i++) {
			System.out.print(s[i]);
		}
	}

	public static boolean isWord(char c) {
		if (c >= 'a' && c <= 'z' || c <= 'Z' && c >= 'A') {
			return true;
		}
		return false;
	}
}
